// 自定义密钥
const secret = "fl.b-18#cd_/12*+chan&koa^!.nam$milo"
const { sign } = require('jsonwebtoken')
const jwt = require('jsonwebtoken')
const UserModel = require('../models/userModel')
const appError = require('./appError')

// 白名单
const whiteList = [
  '/api/v1/user/login',
  '/api/v1/user/register',
  '/api/v1/user/findOne'
]

/**
 * 生成 token
 * @param {*} data 加密的数据，最好不要包括密码之类的
 * @param {*} time 有效时长，数字 1000 表示 1000s; 字符串 '10h' 表示 10小时，'1d' 表示1天；具体参考文档
 */
const signToken = (data, time = '1d') => {
  const token = sign(
    data,
    secret,
    { expiresIn: time }
  )
  return token
}

// 验证 token
const verifyToken = async (ctx, next) => {
  const url = ctx.request.url.split('?')[0]
  if (!whiteList.includes(url)) {
    const token = ctx.request.header?.authorization?.split(' ')[1];
    let result
    // token 解析失败处理
    try {
      result = jwt.verify(token, secret)
    } catch (error) {
      appError(401)
    }
    const user = await UserModel.findOne({ user_id: result.user_id });

    if (user.last_login !== result.token_created_at) {
      appError(401)
    }
  }

  return next()
}

module.exports = {
  signToken,
  verifyToken,
  secret
}
